package hamming;

import external.library.MatrixMultiplication;
import utilities.MatrixUtility;

/**
 * Classe metier du decodeur, permet de corriger et
 * decoder un message recu avec le controle de Hamming
 * 
 * @author Dapy, Dubie
 */
public class Decodeur 
{
	/** Matrice de controle */
	int[][] matriceControle = {{1,0,1,1,1,0,0},
							   {1,1,1,0,0,1,0},
							   {0,1,1,1,0,0,1}};
	
	/**
	 * Methode qui decode le message 
	 * (soustrait les bits de parite du message en entree)
	 * 
	 * @param messageCorrige message en entree
	 * @return message sans les bits de parites
	 */
	public Object decoderMessage(String messageCorrige) 
	{
		return messageCorrige.substring(0,4);
	}

	/**
	 * Verifie si le message recu contient des erreurs et les corrige
	 * 
	 * @param message message a corriger
	 * @return message corrige
	 */
	public String corrigerMessage(String message) 
	{
		StringBuilder messageCorrige;
		MatrixMultiplication matrixMultiplication = new MatrixMultiplication();
		
		int[][] syndrome = matrixMultiplication.calculMatrice(matriceControle, MatrixUtility.stringToMatrice(message));
		boolean erreur = false;
		for(int i = 0; i < syndrome.length ; i++)
		{
			if(syndrome[i][0] != 0)
			{
				erreur = true;
			}
		}
		
		messageCorrige = new StringBuilder(message);
		if(erreur){
			int indiceColonneSimilaire = colonneSimilaire(syndrome);
			if(messageCorrige.charAt(indiceColonneSimilaire) == '0')
			{
				messageCorrige.setCharAt(indiceColonneSimilaire, '1');
			}
			else
			{
				messageCorrige.setCharAt(indiceColonneSimilaire, '0');
			}
		}
		return messageCorrige.toString();
	}
	
	/**
	 * Verifie si deux colonnes sont indentiques
	 * 
	 * @param syndrome colonnes a verifier
	 * @return 0 si les colonnes sont differentes, 1 si elles sont identiques.
	 */
	private int colonneSimilaire(int[][] syndrome)
	{
		int indice = 0;
		boolean colSimilaire;
		for(int i = 1; i < matriceControle[0].length; i++)
		{
			colSimilaire = true;
			for(int j = 0; j < matriceControle.length; j++)
			{
				if(matriceControle[j][i] != syndrome[j][0])
				{
					colSimilaire = false;
				}
			}
			if(colSimilaire)
			{
				indice = i;
				break;
			}
		}
		return indice;
	}
}
